package ifrn.agendaweb.jpa;

import ifrn.agendaweb.modelo.Compromisso;
import ifrn.agendaweb.modelo.Grupo;
import ifrn.agendaweb.modelo.Usuario;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Transactional;

@Transactional
public class GrupoJPA {

	private EntityManager em;

	@PersistenceContext
	public void setEm(EntityManager em) {
		this.em = em;
	}

	public void criar(Grupo modelo) {
		em.persist(modelo);
	}

	public Grupo recuperarPorId(Grupo modelo) throws PersistenciaException {
		try {
			return em.find(Grupo.class, modelo.getId());
		} catch (EntityNotFoundException notFound) {
			throw new PersistenciaException("Entidade buscada não é foi encontrada.");
		} catch (NonUniqueResultException nonUnique) {
			throw new PersistenciaException("A busca retornou mais de um resultado.");
		}
		
	}
	
	public List<Grupo> recuperarPorNomeDescricao(Grupo grupo) {
		
		Query query = em.createQuery("FROM Grupo g "
				+ "WHERE g.nome LIKE '%"+ grupo.getNome() +"%' "
						+ "OR g.descricao LIKE '%"+ grupo.getDescricao() +"%'");
		return query.getResultList();
	}

	
	public List<Grupo> recuperarPorNome(Grupo grupo) {
		
		Query query = em.createQuery("FROM Grupo g "
				+ "WHERE g.nome = :nome");
				
		query.setParameter("nome", grupo.getNome());
		return query.getResultList();
	}
	
	
	public List<Grupo> recuperarPorUsuario(Usuario usuario) {
		
		Query query = em.createQuery("FROM Grupo g "
				+ "WHERE g.usuario.id = :id");
		query.setParameter("id", usuario.getId());
		return query.getResultList();
	}
	
	
	public List<Grupo> recuperarTodos() {
		
		Query query = em.createQuery("FROM Grupo g");
		return query.getResultList();
	}

	public void atualizar(Grupo modelo) {
		em.merge(modelo);
	}

	public void deletar(Grupo modelo) throws PersistenciaException {
		try {
			modelo = this.recuperarPorId(modelo);
			em.remove(modelo);
		} catch (PersistenciaException pex ) {
			throw pex;
		}
	}


}
